home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 Applications 1996 May / SGI IRIX 6.2 Applications 1996 May.iso / dist / impr_dev.idb / usr / impressario / src / libimp / impReadWrite.c.z / impReadWrite.c
C/C++ Source or Header  |  1996-05-06  |  3KB  |  114 lines

  1. /**************************************************************************
  2.  *
  3.  *           Copyright (c)    1993 Silicon Graphics, Inc.
  4.  *            All Rights Reserved
  5.  *
  6.  *       THIS    IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI
  7.  *
  8.  * The copyright notice above does not evidence any actual of intended
  9.  * publication of such source code, and is an unpublished work by Silicon
  10.  * Graphics, Inc. This material contains CONFIDENTIAL INFORMATION that is
  11.  * the property of Silicon Graphics, Inc. Any use, duplication or
  12.  * disclosure not specifically authorized by Silicon Graphics is strictly
  13.  * prohibited.
  14.  *
  15.  * RESTRICTED RIGHTS LEGEND:
  16.  *
  17.  * Use, duplication or disclosure by the Government is subject to
  18.  * restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
  19.  * Technical Data and Computer Software clause at DFARS 52.227-7013,
  20.  * and/or in similar or successor clauses in the FAR, DOD or NASA FAR
  21.  * Supplement. Unpublished - rights reserved under the Copyright Laws of
  22.  * the United States. Contractor is SILICON GRAPHICS, INC., 2011 N.
  23.  * Shoreline Blvd., Mountain View, CA 94039-7311
  24.  **************************************************************************
  25.  *
  26.  * File: impReadWrite.c
  27.  *
  28.  * Description: Internal routines for the reading and writing of image
  29.  *    files.
  30.  *
  31.  **************************************************************************/
  32.  
  33.  
  34. #ident "$Revision: 1.4 $"
  35.  
  36.  
  37. #include <stdio.h>
  38. #include <string.h>
  39. #include <unistd.h>
  40. #include <sys/types.h>
  41. #include <errno.h>
  42. #include "impI.h"
  43.  
  44.  
  45. /**************************************************************************
  46.  *
  47.  * Function: _impWrite
  48.  *
  49.  * Description: Writes the specified data to the specified image.
  50.  *
  51.  * Parameters: 
  52.  *    image (I) - image to write
  53.  *    buffer (I) - data buffer to write
  54.  *    count (I) - number of bytes to write
  55.  *
  56.  * Return: Number of bytes written if successful. -1 and IMPerrno set
  57.  *    if errors.
  58.  *
  59.  **************************************************************************/
  60.  
  61. int _impWrite(IMPImage *image, void *buffer, uint_t count)
  62. {
  63.     register int retv = write(image->file, buffer, count);
  64.     if (retv == count)
  65.     image->offset += count;
  66.     else
  67.     image->offset = (__uint32_t)-1;
  68.     if (retv < 0)
  69.     _impReturnError(errno);
  70.     return retv;
  71. }
  72.  
  73.  
  74. /**************************************************************************
  75.  *
  76.  * Function: _impRead
  77.  *
  78.  * Description: Reads the specified data from the specified image.
  79.  *
  80.  * Parameters: 
  81.  *    image (I) - image to read
  82.  *    buffer (I) - data buffer to read
  83.  *    count (I) - number of bytes to read
  84.  *
  85.  * Return: Number of bytes read if successful. -1 and IMPerrno set
  86.  *    if errors.
  87.  *
  88.  **************************************************************************/
  89.  
  90. int _impRead(IMPImage *image, void *buffer, uint_t count)
  91. {
  92.     register int retv;
  93.  
  94.     if (image->cache == IMPNoCache) {
  95.         retv = read(image->file, buffer, count);
  96.     } else {
  97.     if (image->offset + count > image->cacheoffset + image->cachesize)
  98.         retv = image->cacheoffset + image->cachesize - image->offset;
  99.     else
  100.         retv = count;
  101.     if (retv > 0)
  102.         memcpy(buffer, ((char*)image->cachebuf) +
  103.             image->offset - image->cacheoffset, retv);
  104.     }
  105.  
  106.     if (retv == count)
  107.     image->offset += count;
  108.     else
  109.     image->offset = (__uint32_t)-1;
  110.     if (retv < 0)
  111.     _impReturnError(errno);
  112.     return retv;
  113. }
  114.